//
// Created by fanghr on 18-3-29.
//

#include <unistd.h>
#include <csignal>
#include <cstdlib>

void daemonize(void) {
//下面用于屏蔽一些有关控制终端操作的信号
//防止守护进程没有正常运作之前控制终端受到干扰退出或挂起
#ifdef SIGTTOU
    signal(SIGTTOU, SIG_IGN); //屏蔽后台进程写控制终端信号
#endif
#ifdef SIGTTIN
    signal(SIGTTIN, SIG_IGN); //屏蔽后台读控制终端信号
#endif
#ifdef SIGTSTP
    signal(SIGTSTP, SIG_IGN); //忽略终端挂起
#endif
    if (fork() != 0)
        exit(0); //fork()产生子进程被init进程收养，父进程退出，进程变成daemon
    if (setsid() < 0)
        exit(0); //setsid()创建新会话，并成为首进程
    signal(SIGHUP, SIG_IGN);
    if (fork() != 0)
        exit(0); //再fork()一次防鬼畜
    return;
}

#include <iostream>

int main() {
    daemonize();
    while (1);
}